home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: rec.games.programmer,comp.graphics,rec.answers,comp.answers,news.answers
- Path: bloom-beacon.mit.edu!hookup!usc!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!news.sei.cmu.edu!bb3.andrew.cmu.edu!honeydew.srv.cs.cmu.edu!rochester!rit!isc-newsserver!nick.csh.rit.edu!pat
- From: pat@mail.csh.rit.edu
- Subject: FAQ: 3-D Information for the Programmer
- X-Archive-Information: /pub/3dfaq/FAQ.n @ ftp.csh.rit.edu
- Message-ID: <1994Apr15.184932.8425@ultb.isc.rit.edu>
- Followup-To: rec.games.programmer
- Summary: Still in progress, fill-in-the-blanks...
- Originator: pat@nick.csh.rit.edu
- Keywords: game-programming 3d-transforms faq
- Sender: pat@mail.csh.rit.edu
- Nntp-Posting-Host: nick.csh.rit.edu
- Reply-To: pat@mail.csh.rit.edu
- Organization: Computer Science House @ RIT
- X-Posting-Information: This article posted automagically, weekly.
- Date: Fri, 15 Apr 1994 18:49:32 GMT
- Approved: news-answers-request@MIT.Edu
- Lines: 537
- Xref: bloom-beacon.mit.edu rec.games.programmer:15530 comp.graphics:23475 rec.answers:4908 comp.answers:4921 news.answers:18098
-
- Archive-name: 3d-programmer-info
- Version: $Id: .header,v 1.7 1994/03/14 17:36:21 pat Exp $
-
- O O
-
- ---+ +---- F A Q ------------------+ +------- F A Q ---------------+ +---
- %[%| |X$HOOR$H\[[8@DoooDDDDD8@@[%[%| |X$HOOR$H\[[8@DoooDDDDD8@@[%[%| |X$H
- [[%| |$C$OOR$H\%[8DooooDDDD8D@@[[[%| |$C$OOR$H\%[8DooooDDDD8D@@[[[%| |$C$
- [[%| |X$HHRR$H@[ 88@@[[%| |X$HHRR DDDD88@@[[%| |X$H
- [[[| |$$$HRR$H@%[@8ooooD 888@[[[[| |$$$HRR$H@%[@8o DDDD888@[[[[| |$$$
- [[[| |X$$H / / 88[[[[| |X$ / / D888[[[[| |X$$
- [%[| |XC$H \%[@8DDD DD @[[%[| |XC $H\%[@ DDDD 88@[[%[| |XC$
- [[%| |XC$H \%%@8DD DDDD @[[%| |XC $H\%% DDDDDD 8@@[[%| |XC$
- [%[| |X$$H \%%@88DDD D8 @[%[| |X$ $H\%%@8 DDD8 8@@[%[| |X$$
- [%[| |CX$H \%%[88DDD88 D @[%[| |CX $H\%%[88D 88D 8@@[%[| |CX$
- [%[| |X$CH \%[[@888D8D8 | @[%[| |X$ _$H\%[[@888 88 88@[%[| |X$C
- [%[| |XXCH | [@888D888 | @@[%[| |XX | H\@[[@888 8 88@@[%[| |XXC
- [%[| |XC$$ \ \ | |88@[%[| |XC \ \ | | 8888@[%[| |XC$
- [%[| |XX$HOR$HH@ [@88888 8D8@@[%[| |XX$HOR H@[%[@8 @8888D8@@[%[| |XX$
- [%[| |X$CHOR$H\@% @@@@Y 8888@@[%[| |X$CHOR$ @%%[Y @8888888@@[%[| |X$C
- [%[| |CX$$OR$HH@%% .d8D88@@[%[| |CX$$OR$H .d@@888D88@@[%[| |CX$
- [[[| |X$$HOR$HH@%%[[@@@@88D8D88@[[[| |X$$HOR$HH@%%[[@@@@88D8D88@[[[| |X$$
- [%[| |CX$HOR$HH\%[%[@@@@888D88@@[%[| |CX$HOR$HH\%[%[@@@@888D88@@[%[| |CX$
- ---+ +--------------- F A Q -------+ +------------------ F A Q ----+ +---
-
- Contents:
- 1) General references for 3-d graphics questions.
- 2) How do I define an object?
- 3) How do I define space?
- 4) How do I define position?
- 5) How do I define orientation?
- 6) How do I define a velocity?
- 7) Drawing three-dimensional objects on a two-dimensional screen.
- 8) Vector Math - Dot Product and Cross-Product.
- 9) Matrix Math
- 10) Collisions.
- 11) Perspective.
- 12) Z-Buffering & the Painters Algorithm & BSP-Trees.
- 13) Shading.
- 14) 3-space clipping.
- 15) 3-d scanning.
- 16) Publically available source-code.
- 17) Books on the topics.
- 18) Other forums.
- 19) Current Contents of Archive ftp.csh.rit.edu::/pub/3dfaq
-
- Last update:
- 03Mar94
-
- What's new?
-
- A bit more matrix math.
-
- Added another book to the list
-
- Contents of the Archive I'm keeping on this stuff.
-
- 1) General references for 3-d graphics questions.
-
- Well, this FAQ is just getting off the ground. Hopefully it will
- touch on most of the bases you need to get started for now, and
- hopefully it will expand at least as fast as you need it too. But...
- regardless, things you'll want to locate for more help are Matrix
- Algebra books, Physics books talking about Eulerian motion, and some
- books on the Graphics Hardware you want to program for. The code
- examples included in this FAQ will most likely be in C with pseudo-code
- in comments.
-
- One of the most popular references, (and one of my favorites), is:
- Computer Graphics: Principles and Practice
- ------------------------------------------
- Foley, van Dam, Feiner, and Hughes
- Addison Wesley -- Reading, Massachusetts
- (c) 1990. ISBN 0-201-12110-7
-
- But, you'll also want to definitely check out the FAQ for
- comp.graphics. That FAQ touches mainly on 2-D needs, but some 3-D
- aspects are reviewed there, too.
-
- 2) How do I define an object?
-
- There are lots of ways to define objects. One of the most commonly
- used is the OFF (Object File Format). The OFF toolkit and a library of
- objects are available via anonymous ftp from gatekeeper.dec.com -- XXX
- ???. The format provides easy methods for extensions and a base set of
- things you can expect for each object. The toolkit is a bit bulky, but
- the file format (in ascii) is easy enough to parse by hand.
-
- The OFF.aoff file contains information about the object. The most
- important one there is the location of the surface specification file
- (usually object name.geom). This file also contains other attributes
- -
- and file names relevant to this object.
-
- The OFF surface specification begins with the number of points, the
- number of polygons and the number of segments.
-
- npts nplys nsegs
-
- This line is followed by the floating point coordinates for the points
- that make up the object.
-
- x1 y1 z1
- x2 y2 z2
- x3 y3 z3
- .
-
- .
-
- x(npts) y(npts) z(npts)
-
- Then, it gets a bit more complicated. The following lines begin with a
- number to indicate the number of vertices in this polygon. That number
- is followed by that many numbers, one for each vertex. These are given
- in an order specified in the .aoff (usually conter-clockwise). So, for
- example, a triangle and a pentagon which share a side are shown below.
-
- 3 1 3 4
- 5 2 4 3 6 7
-
- Here is some quick and dirty sample code to read in the .geom file:
-
- struct polygon {
- int nvert; /* Number of vertices in this polygon */
- int *verts; /* Vertices in this polygon */
- };
-
- struct object {
- int npts; /* The number of points */
- int npolys; /* The number of polygons */
- int nsegs; /* The number of segments */
- double *point x,*point y,*point z;
- - - -
- struct polygon *polys;
- };
-
- int
- read geom file( char *geom file, struct object *obj )
- - - -
- {
- FILE *fp;
- int i,j;
-
- if (!(fp = fopen(geom file,"r"))) /* Open the .geom file */
- -
- return -1;
-
- /* Get header information */
- fscanf(fp,"%d %d %d",&obj.npts,&obj.npolys,&obj.nsegs);
-
- /*
- ** Allocate room for the points.
- */
- obj.point x = (double *)malloc(obj.npts*sizeof(double));
- -
- obj.point y = (double *)malloc(obj.npts*sizeof(double));
- -
- obj.point z = (double *)malloc(obj.npts*sizeof(double));
- -
-
- for (i=0;i<obj.npts;++i)
- fscanf(fp,"%lf %lf %lf",&obj.point x[i],
- -
- &obj.point y[i],
- -
- &obj.point z[i]);
- -
-
- /* Allocate room for the polygons. */
- obj.polys = (struct polygon *)malloc(obj.npolys*sizeof(struct polygon));
-
- for (i=0;i<obj.npts;++i) {
- /* See how many vertices this has */
- fscanf(fp,"%d",&obj.polys[i].nvert);
-
- /* Allocate room for vertices */
- obj.polys[i].verts = (int *)malloc(obj.npolys*sizeof(int));
-
- /* Get each vertex */
- for (j=0;j<obj.polys[i].nvert;++j)
-
- fscanf(fp,"%d",&obj.polys[i].verts[j]);
-
- }
- }
-
- 3) How do I define space?
-
- There are several things to consider when picking a coordinate
- system. Most important of these is how you intend to handle objects.
- If your objects are defined in terms of <x,y,z> triplets, it will
- require a fair bit of work on reading them in to turn them into
- spherical coordinates. If you're looking to this FAQ for information on
- how to define the space your objects will be in, I'd strongly suggest
- using rectangular coordinates and some derivative of the OFF-format.
-
- For starters, let me just throw in that while our universe may be
- infinite in all directions, that doesn't make for good programming. We
- have to limit ourselves to small enough numbers that we can multiply
- them together without overflowing them, we can divide them without
- crashing our systems, and we can add them without accidentally flipping
- a sign bit.
-
- Now, the fun begins. The simplest form of defining the Universe is
- to flat out say that the Universe stretches over these coordinates, say
- in the bounding box of <-65536, -65536, -65536> to <65536, 65536,
- 65536>. This is often referred to as a Universal Coordinate system or
- an Absolute Coordinate system. Then, each object in the Universe will
- be centered about some coordinate in that range. This includes your
- viewpoint. Several strategies are available for dealing with the edge
- of the Universe. One can make the Universe wrap around so that an
- object leaving the cube at < X, Y, 65536> will re-appear in the Universe
- at < X, Y, -65536>. Or, one can make objects bounce or stop at the edge
- of the Universe. And, given any approach, one can have the edge of the
- Universe be transparent or opaque.
-
- In an Absolute Coordinate system, all objects must be shown from
- the position of your viewpoint. This involves lots of interesting math
- that we'll get into later. But, in general, an objects position with
- respect to you is it's absolute position - your absolute position (with
- all kinds of hell breaking loose if you can see past the edge of the
- Universe). Then, after this position is calculated, it must be rotated
- based on your orientation in the Universe.
-
- Another possibility for defining space is a Relative Coordinate
- system or a View-Centered Coordinate system. In this sort of system,
- the Viewpoint is always at coordinates <0,0,0> and everything else in
- the Universe is based relatively to this home position. This causes
- funky math to come into play when dealing with velocities of objects,
- but... it does wonders for not having to deal with the 'edge of the
- Universe'. This is the Schroedinger's cat method of the 'edge of the
- Universe'.... in the truest sense of out of sight is out of mind. Small
- provisions have to be made if objects aren't to wrap around. But... a
- Relative Coordinate system can be used to give the illusion of infinite
- space on a finite machine. (Yes, even your 486/66DX is finite).
-
- I'll leave spherical coordinates to a later version if people think
- they'll be of use...
-
- 4) How do I define position?
-
- Position in an Absolute Coordinate system is easy. Each object has
-
- three coordinates. These are often stored in a data-type called a
-
- vector to abstract further the notion that these numbers belong
- together.
-
- typedef struct {
- long x;
- long y;
- long z;
- } VECT;
-
- Usually, each object in the Universe is defined about its center with
- each coordinate on its surface being centered at its own <0,0,0>. This
- helps tremendously in rotating the object, and I would highly recommend
- this. Then, the object as a whole is given a position in space. When
- it comes time to draw this object, its points' coordinates get added on
- to its position.
-
- In a Relative Coordinate system, position is also fairly straight
- forward. The view-point always has position VECT={ 0, 0, 0 };. Other
- objects follow the same sort of system that they would in Absolute
- Coordinate systems.
-
- 5) How do I define orientation?
-
- Orientation can be quite tricky. I interchange some of the terms
- here quite often. In 3-space, orientation must be defined be two-and-
- a-half angles. "Two and a half?" you say. Well, almost everyone uses
- three because two just isn't enough, but if you want to be technical,
- one of those angles only has to range from 0 - 180 degrees (0 - PI/2
- radians).
-
- But, taking that for granted now.... you have to pick an
- orientation for your view. I personally prefer to have the X-axis run
- from left to right across the center of my screen. I also like to have
- the Y-axis run from the bottom of my screen; and I also like to have the
- Z-axis running from me straight into my screen. With some tweaking of
- plus and minus signs and a bit of re-ordering, all of the math here-in
- can be modified to reflect any orientation of the coordinate system.
- Some people prefer to have the Y-axis heading into the screen with the
- Z-axis going vertically. It's all a matter of how you want to define
- stuff.
-
- Given that you've agreed with me that Z can go into the screen,
- what 3-angles do you need? (Here's where I stand the biggest chance of
- mucking up the terms.) You need roll, pitch, and yaw. (I often mix up
- roll and yaw and such... so if you can follow along without getting
- locked into my terminology, future FAQ's will correct it.)
-
- Look at your monitor as you're reading this. Now tilt your head so
- that your right ear is on your right shoulder. This change in
- orientation is roll (or yaw... but I call it roll).
-
- Ok, now sit up straight again. Now bring your chin down to meet
- your chest. (Hmmm... LOOK BACK NOW!!!, whew... glad you heard me.)
- That motion was pitch.
-
- Ok, now look over your right shoulder keeping your head vertical to
- see who's behind you. (LOOK BACK AGAIN!!.) Ok... that was yaw (or
- roll, but I call it yaw).
-
- That's the basics. Now, what do I do with them? Well, here's
- where a nice book on Matrix Arithmetic will help you out. You have to
-
- use these three angles to make a Transformation matrix. [See the
-
- section on Matrix Math]. Here is a typical method of doing these
- transformations: [Note, if you don't have Z going into your screen
- you'll have to munge these considerably].
-
- typedef double matrix[4][4];
- double sr,sp,sy,cr,cp,cy;
- matrix mr, mp, my; /* individual transformations */
- matrix s; /* final matrix */
-
- sr = sin( roll ); cr = cos( roll );
- sp = sin( pitch ); cp = cos( pitch );
- sy = sin( yaw ); cy = cos( yaw );
-
- /* clear all matrixes
- ** [See the section on Matrix Math]
- */
- identity( &mr ); identity( &mp ); identity( &my );
- /* prepare roll matrix */
- mr[0][0] = mr[1][1] = cr;
- mr[1][0] = - (mr[0][1] = sr);
-
- /* prepare pitch matrix */
- mp[1][1] = mp[2][2] = cp;
- mp[1][2] = - (mp[2][1] = sp);
-
- /* prepare yaw matrix */
- my[0][0] = my[2][2] = cy;
- my[0][2] = - (my[2][0] = sy);
-
- multiply( &mr, &my, &s );
- multiply( &s, &mp, &s );
-
- 6) How do I define a velocity?
-
- Sticky question. I'll get to it in the next rev.
-
- 7) Drawing three-dimensional objects on a two-dimensional screen.
-
- Modified from comp.graphics FAQ:
-
- "There are many ways to do this. Some approaches map the
- viewing rectangle onto the scene, by shooting rays through
- each pixel center and assigning color according to the object
- hit by the ray. Other approaches map the scene onto the
- viewing rectangle, by drawing each object into the region,
- keeping track of which object is in front of which.
-
- The mapping mentioned above is also referred to as a
- 'projection', and the two most popular projections are
- perspective projection and parallel projection. For example,
- to do a parallel projection of a scene onto a viewing
- rectangle, you can just discard the Z coordinate, and 'clip'
- the objects to the viewing rectangle (discard portions that
- lie outside the region). To do a perspective projection,
- dividing each the x and the y by some multiple or the Z-depth
- is the usual approach.
-
- For details on 3D rendering, the Foley, van Dam, Feiner and
- Hughes book, reading. Chapter 6 is 'Viewing in 3D', and
- chapter 15 is 'Visible-Surface Determination'. For more
-
- information go to chapter 16 for shading, chapter 19 for
-
- clipping, and branch out from there."
-
- 8) Vector Math - Dot Product and Cross-Product.
-
- Adding and subtracting vectors is as easy as subtracting their
- respective parts:
-
- <A,B,C> + <D,E,F> = <A+D, B+E, C+F>
- <A,B,C> - <D,E,F> = <A-D, B-E, C-F>
-
- Scaling vectors is as simple as multiplying each part by a
- constant:
-
- S * <A,B,C> = <S*A, S*B, S*C>
-
- The Dot-Product of two vectors is simply the sum of the products of
- their respective parts:
-
- <A,B,C> . <D,E,F> = A*D + B*E + C*F
-
- Note that this value is not a vector.
-
- The Cross-Product of two vectors is a bit more complex (it is the
- determinant of the matrix with the direction vector as the first row,
- the first vector as the second row, and the second vector as the third
- row):
-
- <A,B,C> X <D,E,F> = <B*F - C*E, C*D - A*F, A*E - B*D>
-
- Note that:
-
- <A,B,C> X <D,E,F> = -1 * ( <D,E,F> X <A,B,C> )
- -and-
- (<A,B,C> X <D,E,F>) . <A,B,C> = (<A,B,C> X <D,E,F>) . <D,E,F> = 0
-
- More later.
-
- 9) Matrix Math
-
- The identity matrix is a square matrix (same number of rows as
- columns) with all elements {i,j} given by:
-
- { 1.0 if i == j
- m[i][j] = {
- { 0.0 otherwise
-
- Multiplication of matrices:
-
- if X is a matrix that is m rows and n columns (an m-by-n (or mxn) matrix)
- and Y is a matrix that is n rows and r columns (nxr), then the product
- X * Y ==> m[i][j] = sum{ a=0, a<n, X[i][a] * Y[a][j] };
-
- As you can see in this example, the result is a matrix with m rows and r
- columns (an mxr) matrix. The most usual case in basic 3-d graphics is
- multiplication of 3x3 or 4x4 matrices to each other.
-
- Some important things to remember about matrix multiplication: (The
-
- following assume X and Y and Z are matrices and I is an identity matrix)
-
- X * Y rarely equals Y * X. but,
- X * ( Y * Z ) equals ( X * Y ) * Z
- X * I = I * X = X
- if (X * Y = I) then (Y * X = I)
-
- Multiplication of a Matrix and a Vector is simply a special case of
- multiplying two matrixes. It just so happens that a vector is a matrix
- with only one column. So, in order to multiply an mxn matrix by a
- vector, you have to have an nx1 matrix ("an n-vector" or "a vector in
- n"). The result is a vector in m. As a quick example:
-
- [ a b ] [ g ] [ a*g + b*h ]
- [ c d ] x [ h ] = [ c*g + d*h ]
- [ e f ] [ e*g + f*h ]
-
- 10) Collisions.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 11) Perspective.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 12) Z-Buffering & the Painters Algorithm & BSP-Trees.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 13) Shading.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 14) 3-space clipping.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 15) 3-d scanning.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 16) Publically available source-code.
-
- Well, I've started a collection at ftp.csh.rit.edu::/pub/3dfaq/src.
- Feel free to upload relevant stuff (that I can't find on archie in under
- twenty minutes). Some other sites of interest:
- stereograms:
-
- ftp.comlab.ox.ac.uk::pub/Documents/3d
-
- http://enigma.phys.utk.edu/stereo/index.html
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 17) Books on the topics.
-
- Computer Graphics: Principles and Practice Foley, van Dam, Feiner, and
- Hughes; Addison Wesley -- Reading, Massachusetts; (c) 1990. ISBN
- 0-201-12110-7.
-
- I highly reccomend this book for the person seriously interested in
- understanding Computer Graphics concepts for 2-D image-generation
- and 3-D representation. As a warning though, if you're struggling
- to follow vector math and such, you might not spend the $60-$80
- bucks on this one yet.
-
- Programming in 3 Dimensions Christopher D. Watkins and Larry Sharp;
- Barnes & Noble.
-
- I've never seen this book. I've got an add for it in front of me.
- (Sorry, no ISBN number listed). I would guess it's a very low-
- density version of some of the 3-D things from Foley. The book
- boasts sample source code on MS/PC-DOS floppy included. "This one
- is for all graphics enthusiasts who want a detailed look at 3-D
- graphics and modeling. Also features discussions of popular ray
- tracinge methods and computer animation." [sic]
-
- Computer Graphics Handbook: Geometry and Mathematics, Michael E.
- Mortenson. ISBN 0-8311-1002-3
-
- I've never seen this one, but it comes net-recommended.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 18) Other forums.
-
- Sorry... wanted to get at least a partial FAQ out soon, so this
- section is mostly blank for now. Will do more later.
-
- 19) Current Contents of Archive ftp.csh.rit.edu::/pub/3dfaq
-
- 2 -rw-r--r-- 1 pat member 219 Apr 2 20:40 README
- 16 -rw-r--r-- 1 pat member 7787 Mar 28 19:11 DoomTechniques.gz
- 14 -rw-r--r-- 1 pat vr 6266 Apr 2 20:38 imath.gz
-
- 22 -rw-r--r-- 1 pat vr 11262 Apr 2 20:43 imath.tar.gz
-
- --
- "I've seen attack ships on fire off the shoulder of Orion."
-